package org.example.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

public class StrExtractor {
    /**
     * 从JSON字符串中提取指定字段的值（正则实现）
     * @param jsonString 原始JSON字符串
     * @param fieldName  要提取的字段名（如"query"）
     * @return 字段值（未匹配时返回null）
     */
    public static String extractField(String jsonString, String fieldName) {
        // 构建正则表达式：支持空格、换行和转义双引号
        String regex = "\"" + Pattern.quote(fieldName) + "\":\\s*\"(.*?[^\\\\])\"";
        Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
        Matcher matcher = pattern.matcher(jsonString);

        if (matcher.find()) {
            // 处理转义字符（如\" -> "）
            return matcher.group(1).replace("\\\"", "\"");
        }
        return null; // 未匹配时返回null
    }


    /**
     * 从JSON字符串中提取首个message的query值
     * @param jsonStr 完整的JSON字符串
     * @return query值（失败时返回null）
     */
    public static String extractQueryValue(String jsonStr) {
        try {
            // 1. 解析外层JSON
            JSONObject root = JSONUtil.parseObj(jsonStr);
            JSONArray messages = root.getJSONArray("messages");
            if (messages.isEmpty()) return null;

            // 2. 获取首个message的content
            JSONObject firstMsg = messages.getJSONObject(0);
            String content = firstMsg.getStr("content");

            // 3. 定位目标标记位置
            String marker = "以下是需要你为用户呈现理解的问题：";
            int startIdx = content.indexOf(marker);
            if (startIdx == -1) return null;

            // 4. 提取query对象片段
            String targetSection = content.substring(startIdx + marker.length());
            int jsonStart = targetSection.indexOf("{");
            int jsonEnd = targetSection.lastIndexOf("}") + 1;
            if (jsonStart == -1 || jsonEnd <= jsonStart) return null;

            String jsonSegment = targetSection.substring(jsonStart, jsonEnd).trim();

            // 5. 解析query值
            JSONObject queryObj = JSONUtil.parseObj(jsonSegment);
            return queryObj.getStr("query");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}
